Podsumowanie
analizy
Biblioteki
library(dplyr)
library(ggplot2)
library(tidyr)
library(plotly)
library(knitr)
library(caret)
library(randomForest)
Wczytanie danych
data <- read.csv("mp_batteries.csv")
columns <- names(data)
string_columns <- c("Battery.Formula", "Working.Ion", "Formula.Charge", "Formula.Discharge")
numeric_columns <- setdiff(columns, c(string_columns, "Battery.ID"))
Podstawowe
statystyki
Liczba wierszy: 4351.
Podsumowanie:
kable(summary(data))
|
Length:4351 |
Length:4351 |
Length:4351 |
Length:4351 |
Length:4351 |
Min. : 0.00002 |
Min. :-7.755 |
Min. : 5.176 |
Min. : 24.08 |
Min. :-583.5 |
Min. :-2208.1 |
Min. :0.00000 |
Min. :0.007407 |
Min. :0.00000 |
Min. :0.00000 |
Min. :1.000 |
Min. : 0.0000 |
|
Class :character |
Class :character |
Class :character |
Class :character |
Class :character |
1st Qu.: 0.01747 |
1st Qu.: 2.226 |
1st Qu.: 88.108 |
1st Qu.: 311.62 |
1st Qu.: 211.7 |
1st Qu.: 821.6 |
1st Qu.:0.00000 |
1st Qu.:0.086957 |
1st Qu.:0.03301 |
1st Qu.:0.01952 |
1st Qu.:1.000 |
1st Qu.: 0.0000 |
|
Mode :character |
Mode :character |
Mode :character |
Mode :character |
Mode :character |
Median : 0.04203 |
Median : 3.301 |
Median : 130.691 |
Median : 507.03 |
Median : 401.8 |
Median : 1463.8 |
Median :0.00000 |
Median :0.142857 |
Median :0.07319 |
Median :0.04878 |
Median :1.000 |
Median : 0.0000 |
|
NA |
NA |
NA |
NA |
NA |
Mean : 0.37531 |
Mean : 3.083 |
Mean : 158.291 |
Mean : 610.62 |
Mean : 444.1 |
Mean : 1664.0 |
Mean :0.03986 |
Mean :0.159077 |
Mean :0.14257 |
Mean :0.12207 |
Mean :1.167 |
Mean : 0.1503 |
|
NA |
NA |
NA |
NA |
NA |
3rd Qu.: 0.08595 |
3rd Qu.: 4.019 |
3rd Qu.: 187.600 |
3rd Qu.: 722.75 |
3rd Qu.: 614.4 |
3rd Qu.: 2252.3 |
3rd Qu.:0.04762 |
3rd Qu.:0.200000 |
3rd Qu.:0.13160 |
3rd Qu.:0.09299 |
3rd Qu.:1.000 |
3rd Qu.: 0.0000 |
|
NA |
NA |
NA |
NA |
NA |
Max. :293.19322 |
Max. :54.569 |
Max. :2557.627 |
Max. :7619.19 |
Max. :5926.9 |
Max. :18305.9 |
Max. :0.90909 |
Max. :0.993333 |
Max. :6.48710 |
Max. :6.27781 |
Max. :6.000 |
Max. :26.9607 |
Analiza wartości
atrybutów
Atrybuty
tekstowe
10 naliczniej
występujących wartości dla każdego atrybutu tekstowego
10 najliczniej występujących wartości zmiennej
Battery.Formula
| Li0-1V2OF5 |
19 |
| Li0-1CoPO4 |
18 |
| Li0-1FePO4 |
18 |
| Li0-3MnFeCo(PO4)3 |
17 |
| Li0-1MnPO4 |
15 |
| Li0-1V4OF11 |
15 |
| Li0-1V4O5F7 |
12 |
| Li0-1VF5 |
12 |
| Li0-1CrP2O7 |
11 |
| Li0-2MnP2O7 |
11 |
10 najliczniej występujących wartości zmiennej
Working.Ion
| Li |
2440 |
| Ca |
435 |
| Mg |
423 |
| Zn |
366 |
| Na |
309 |
| K |
107 |
| Al |
95 |
| Y |
93 |
| Rb |
50 |
| Cs |
33 |
10 najliczniej występujących wartości zmiennej
Formula.Charge
| MnO2 |
49 |
| TiO2 |
47 |
| VO2 |
46 |
| CrO2 |
45 |
| CoO2 |
43 |
| NiO2 |
41 |
| FeO2 |
36 |
| FePO4 |
26 |
| WO2 |
25 |
| CoPO4 |
24 |
10 najliczniej występujących wartości zmiennej
Formula.Discharge
| LiCoPO4 |
19 |
| LiFePO4 |
19 |
| LiMnPO4 |
19 |
| LiV2OF5 |
19 |
| Li5Mn6(BO3)6 |
18 |
| Li3MnFeCo(PO4)3 |
17 |
| LiV4OF11 |
15 |
| Li2MnP2O7 |
14 |
| Li2FeSiO4 |
13 |
| LiCrPO4 |
12 |
10 najliczniej występujących wartości zmiennej
Battery.ID
| mp-1001925_Mg |
1 |
| mp-1003319_Ca |
1 |
| mp-10033_Cs |
1 |
| mp-10033_Rb |
1 |
| mp-1008911_Li |
1 |
| mp-1009555_Li |
1 |
| mp-1009747_Li |
1 |
| mp-1009747_Na |
1 |
| mp-1012668_Li |
1 |
| mp-1012678_Na |
1 |
Liczba wystąpień
wartości

Wnioski
Battery.ID to idenryfikator baterii. Jest on unikalny w zbiorze.
Zmienne Battery.Formula, Formula.Charge i Formula.Discharge cechują się
dużą liczbą różnych wartości. Oznacza to że testowane jest wiele różnych
możliwych subastancji, które mogą zostać użyte do produkcji baterii.
Inaczej jest w przypadku zmiennej Working.Ion. Ponad połowa materiałów
jako głównego jonu używa litu. Wydaje się to być dominujący trend w
badaniach nad bateriami.
Atrybuty
liczbowe
Wartości puste
nan_counts <- sapply(numeric_columns, function(col) sum(is.nan(data[[col]])))
nan_counts_df <- data.frame(
nan = nan_counts
)
print(kable(nan_counts_df))
| Max.Delta.Volume |
0 |
| Average.Voltage |
0 |
| Gravimetric.Capacity |
0 |
| Volumetric.Capacity |
0 |
| Gravimetric.Energy |
0 |
| Volumetric.Energy |
0 |
| Atomic.Fraction.Charge |
0 |
| Atomic.Fraction.Discharge |
0 |
| Stability.Charge |
0 |
| Stability.Discharge |
0 |
| Steps |
0 |
| Max.Voltage.Step |
0 |
Rozkłady
wartości

Wnioski
W zbiorze danych nie brakuje żadnych wartości. Rozkłady większości
zmiennych mają wyraźnie zaznaczony najczęściej występujący przedział
wartości. Z reguły jest on dość wąski w stosunku do całej dziedziny.
Korelacja
numeric_df <- data[, numeric_columns]
correlation_matrix <- cor(numeric_df)
correlation_df <- as.data.frame(as.table(correlation_matrix))
names(correlation_df) <- c("x", "y", "cor")
correlation_df_one_dir <- correlation_df[as.character(correlation_df$x) < as.character(correlation_df$y), ]
correlation_df_sorted <- correlation_df_one_dir[order(-abs(correlation_df_one_dir$cor)), ] %>%
slice(1:length(correlation_df_one_dir$cor))
print(names(correlation_df_sorted))
## [1] "x" "y" "cor"
Korelacja wszytskich
par zmiennych numerycznych
kable(correlation_df_sorted)
| Gravimetric.Energy |
Volumetric.Energy |
0.9283253 |
| Gravimetric.Capacity |
Volumetric.Capacity |
0.8584163 |
| Stability.Charge |
Stability.Discharge |
0.8028701 |
| Atomic.Fraction.Discharge |
Gravimetric.Capacity |
0.6807716 |
| Average.Voltage |
Gravimetric.Energy |
0.6656523 |
| Atomic.Fraction.Discharge |
Volumetric.Capacity |
0.6180186 |
| Atomic.Fraction.Charge |
Atomic.Fraction.Discharge |
0.5974157 |
| Average.Voltage |
Volumetric.Energy |
0.5545191 |
| Max.Voltage.Step |
Steps |
0.5352539 |
| Gravimetric.Capacity |
Max.Delta.Volume |
0.4337733 |
| Gravimetric.Energy |
Max.Voltage.Step |
0.3292322 |
| Volumetric.Capacity |
Volumetric.Energy |
0.3257482 |
| Gravimetric.Energy |
Steps |
0.2946075 |
| Atomic.Fraction.Discharge |
Max.Delta.Volume |
0.2906921 |
| Max.Voltage.Step |
Volumetric.Energy |
0.2526625 |
| Max.Delta.Volume |
Volumetric.Capacity |
0.2424769 |
| Steps |
Volumetric.Energy |
0.2381420 |
| Gravimetric.Capacity |
Volumetric.Energy |
0.2304216 |
| Gravimetric.Capacity |
Gravimetric.Energy |
0.2132463 |
| Average.Voltage |
Volumetric.Capacity |
-0.2128178 |
| Gravimetric.Energy |
Volumetric.Capacity |
0.2098406 |
| Stability.Charge |
Volumetric.Energy |
0.1783271 |
| Atomic.Fraction.Discharge |
Average.Voltage |
-0.1716903 |
| Gravimetric.Energy |
Stability.Charge |
0.1669819 |
| Average.Voltage |
Stability.Charge |
0.1661371 |
| Atomic.Fraction.Discharge |
Steps |
0.1641713 |
| Atomic.Fraction.Charge |
Volumetric.Energy |
-0.1473523 |
| Average.Voltage |
Gravimetric.Capacity |
-0.1462222 |
| Gravimetric.Capacity |
Steps |
0.1333977 |
| Atomic.Fraction.Charge |
Gravimetric.Capacity |
0.1289210 |
| Average.Voltage |
Stability.Discharge |
-0.1284568 |
| Average.Voltage |
Max.Voltage.Step |
0.1271208 |
| Steps |
Volumetric.Capacity |
0.1037051 |
| Atomic.Fraction.Discharge |
Max.Voltage.Step |
0.1019796 |
| Stability.Charge |
Volumetric.Capacity |
0.1015305 |
| Atomic.Fraction.Charge |
Gravimetric.Energy |
-0.0972924 |
| Gravimetric.Capacity |
Max.Voltage.Step |
0.0951906 |
| Max.Voltage.Step |
Stability.Charge |
0.0940466 |
| Average.Voltage |
Max.Delta.Volume |
-0.0823707 |
| Gravimetric.Energy |
Stability.Discharge |
-0.0782609 |
| Atomic.Fraction.Discharge |
Gravimetric.Energy |
0.0645248 |
| Gravimetric.Capacity |
Stability.Charge |
0.0633871 |
| Stability.Discharge |
Steps |
-0.0631686 |
| Average.Voltage |
Steps |
0.0627851 |
| Max.Voltage.Step |
Volumetric.Capacity |
0.0626085 |
| Atomic.Fraction.Discharge |
Volumetric.Energy |
0.0610586 |
| Gravimetric.Energy |
Max.Delta.Volume |
-0.0609858 |
| Stability.Discharge |
Volumetric.Energy |
-0.0599949 |
| Max.Delta.Volume |
Volumetric.Energy |
-0.0588321 |
| Atomic.Fraction.Charge |
Stability.Discharge |
-0.0523971 |
| Atomic.Fraction.Charge |
Average.Voltage |
-0.0385556 |
| Stability.Charge |
Steps |
-0.0374860 |
| Max.Delta.Volume |
Stability.Charge |
0.0337587 |
| Atomic.Fraction.Discharge |
Stability.Charge |
0.0324051 |
| Stability.Discharge |
Volumetric.Capacity |
0.0317012 |
| Atomic.Fraction.Charge |
Steps |
0.0297369 |
| Atomic.Fraction.Charge |
Stability.Charge |
-0.0273571 |
| Atomic.Fraction.Charge |
Max.Delta.Volume |
0.0213153 |
| Max.Voltage.Step |
Stability.Discharge |
-0.0165552 |
| Atomic.Fraction.Discharge |
Stability.Discharge |
0.0143204 |
| Max.Delta.Volume |
Steps |
-0.0132582 |
| Gravimetric.Capacity |
Stability.Discharge |
0.0125390 |
| Max.Delta.Volume |
Max.Voltage.Step |
-0.0099251 |
| Max.Delta.Volume |
Stability.Discharge |
0.0077357 |
| Atomic.Fraction.Charge |
Max.Voltage.Step |
0.0053420 |
| Atomic.Fraction.Charge |
Volumetric.Capacity |
0.0012456 |
Przedstawienie
zależności 5 par zmiennych o najwyższej korelacji
| Gravimetric.Energy |
Volumetric.Energy |
0.9283253 |
| Gravimetric.Capacity |
Volumetric.Capacity |
0.8584163 |
| Stability.Charge |
Stability.Discharge |
0.8028701 |
| Atomic.Fraction.Discharge |
Gravimetric.Capacity |
0.6807716 |
| Average.Voltage |
Gravimetric.Energy |
0.6656523 |
Wnioski
Wysoka korelacja zmiennych Gravimetric.Energy i Volumetric.Energy,
oraz Gravimetric.Capacity i Volumetric.Capacity wydaje się logiczna,
ponieważ te pary zmiennych powiązane są z gęstością enegrii i pojemności
baterii. Dla pary Stability.Charge i Stability.Discharge, wynik również
jest zgodny z oczekiwaniami. Stabilość substancji w jednym stanie może
być związana z jej stabilością w innym. Dwie pozostałe pary zmiennych o
wysokiej korelacji (dla których ta korelacja jest już znacznie niższa)
wydają się bardziej interesujące z punktu widzenia badań nad nowymi
materiałami.
Najważniejsze
trendy
Najważniejszym trendem w badaniach nad bateriami wydaje się być
zastosowanie litu jako głównego jonu odpowiadającego za transport
ładunku. Innymi pierwiastaki często stosowanymi w tym celu są wapń i
magnez, natomiast jest to znacznie rzadsze.
print(sum(grepl("O", data$Formula.Charge, ignore.case = FALSE)))
## [1] 3824
print(sum(grepl("O", data$Formula.Discharge, ignore.case = FALSE)))
## [1] 3824
Innym pierwiastkiem często używanym w materiałach do produkcji
baterii jest tlen. 3848 materiałów ze zbioru zawiera go w stanie
naładowanym i rozładowanym.
Ważnym celem w badaniach nad bateriami jest zwiększanie pojemości
oraz gęstości energii. Na bazie uzyskanych wartości korelacji pomiędzy
zmiennymi wydaje się że badania nad zwiększeniem udziału atomowego
składników w stanie rozładowanym mogą mieć pozytywne skutki dla
pojemności, a nad średnim napięciem dla energii.
Predykcja dalszych
cech
Przygotowanie
regreora
W celu predykcji wartości Volumetric.Capacity nowych materiałów
zastosowano regresor wykorzystujący algorytm Random Forest. Z danych
uczących usunięto kolumny tekstowe z wyjątkiem Working.Ion, z uwagi na
ich niską informatywność dla regresora - bardzo dużo liczba wartości
kategorycznych. Usnięto również zmienną Gravimetric.Capacity - wysoka
korelacja z Volumetric.Capacity sprawia że predykcja na jej bazie jest
pozbawiona sensu.
regression_columns <- setdiff(columns, c("Battery.Formula", "Formula.Charge", "Formula.Discharge", "Battery.ID", "Gravimetric.Capacity"))
source <- data[regression_columns]
idx <- createDataPartition(y = source$Volumetric.Capacity, p = 0.7, list = FALSE)
train <- source[idx,]
test <- source[-idx,]
ctrl <- trainControl(method = "repeatedcv",
number = 2, repeats = 5)
fit <- train(Volumetric.Capacity ~ .,
data = train,
method = "rf",
trControl = ctrl,
importance = TRUE,
ntree = 10)
rfClasses <- predict(fit, newdata = test)
Wyniki uczenia
kable(fit$results, caption="Tabela wyników z podzbioru uczącego")
Tabela wyników z podzbioru uczącego
| 2 |
272.7778 |
0.8036340 |
137.87964 |
31.51806 |
0.0386296 |
11.200877 |
| 10 |
179.4066 |
0.9018196 |
65.46690 |
17.84443 |
0.0216064 |
5.095552 |
| 19 |
179.3845 |
0.9005684 |
51.09529 |
27.68511 |
0.0298584 |
5.360939 |
res_pred <- postResample(pred = rfClasses, obs = test$Volumetric.Capacity)
kable(res_pred[1:2])
| RMSE |
166.8796016 |
| Rsquared |
0.9152176 |
Predykcja cech nowych
materiałów
Predykcję wartości Volumetric.Capacity dla nowych baterii
przeprowadzono na trzech przykładach. Zostały one przestawaione w
poniższej tabeli:
new_materials <- data.frame(
Working.Ion = c("Li", "Li", "Ca"),
Max.Delta.Volume = c(3, 0.1, 0.5),
Average.Voltage = c(0.1, -0.2, 0.4),
Gravimetric.Energy = c(200, 50, 100),
Volumetric.Energy = c(600, 150, 300),
Atomic.Fraction.Charge = c(0, 0, 0.5),
Atomic.Fraction.Discharge = c(0.75, 0.8, 0.9),
Stability.Charge = c(0, 0.1, 0.05),
Stability.Discharge = c(0.01, 0.05, 0.1),
Steps = c(1, 1, 1),
Max.Voltage.Step = c(0, 0, 0)
)
predicted <- predict(fit, newdata = new_materials)
new_materials$Predicted.Volumetric.Capacity = predicted
kable(new_materials)
| Li |
3.0 |
0.1 |
200 |
600 |
0.0 |
0.75 |
0.00 |
0.01 |
1 |
0 |
5438.799 |
| Li |
0.1 |
-0.2 |
50 |
150 |
0.0 |
0.80 |
0.10 |
0.05 |
1 |
0 |
1245.527 |
| Ca |
0.5 |
0.4 |
100 |
300 |
0.5 |
0.90 |
0.05 |
0.10 |
1 |
0 |
2200.500 |